/**
* Desc: 配置文件
* User: cuixiaonai
* Email: 15965873315@163.com
* Date: 2022/1/10 11:30 AM
 */
package config

import (
	"encoding/json"
	"go_gin_mvc/src/pkg/logging"
	"io/ioutil"
	"os"
	"sync"
)

/**
* Desc: 全局配置
* User: cuixiaonai
* Email: 15965873315@163.com
* Date: 2022/1/10 11:30 AM
 */
type GlobalConfig struct {
	Self      SelfConfig      `json:"Self"`
	Database  DatabaseConfig  `json:"Database"`
	Datasetup DataSetUpConfig `json:"Datasetup"`
	Mail      MailConfig      `json:"Mail"`
}

/**
* Desc: ip端口配置
* User: cuixiaonai
* Email: 15965873315@163.com
* Date: 2022/1/10 11:30 AM
 */
type SelfConfig struct {
	Host string `json:"RouterHost"`
	Port string `json:"RouterPort"`
}

/**
* Desc: 数据库配置
* User: cuixiaonai
* Email: 15965873315@163.com
* Date: 2022/1/10 11:30 AM
 */
type DatabaseConfig struct {
	Type            string `json:"Type"`            // 数据库类型
	DbHost          string `json:"DbHost"`          // 主机
	DbPort          string `json:"DbPort"`          // 端口
	DbUser          string `json:"DbUser"`          // 用户
	DbPassword      string `json:"DbPassword"`      // 密码
	DbName          string `json:"DbName"`          // 库名
	MaxIdleConns    int    `json:"MaxIdleConns"`    // 空闲连接池中连接的最大数量
	MaxOpenConns    int    `json:"MaxOpenConns"`    // 打开数据库连接的最大数量
	ConnMaxLifetime int    `json:"ConnMaxLifetime"` // 连接可复用的最大时间（小时）
}

/**
* Desc: 返回数据设置
* User: cuixiaonai
* Email: 15965873315@163.com
* Date: 2022/1/10 11:30 AM
 */
type DataSetUpConfig struct {
	Type             string `json:"Type"`             // 使用加密方法，R-C=RSA-CBC
	WhetherToEncrypt int    `json:"WhetherToEncrypt"` // 是否加密 1=加密 0=不加密
	Key              string `json:"Key"`
	Vi               string `json:"Vi"`
}

/**
* Desc: 邮件发送
* User: cuixiaonai
* Email: 15965873315@163.com
* Date: 2022/1/10 11:30 AM
 */
type MailConfig struct {
	MailHost  string `json:"MailHost"`  // 邮件服务器地址
	MailPort  int    `json:"MailPort"`  // 端口
	MailUser  string `json:"MailUser"`  // 发送邮件用户账号
	MailPwd   string `json:"MailPwd"`   // 授权密码
	UserAlias string `json:"UserAlias"` // 用户别名
}

var (
	globalConfig *GlobalConfig
	configMux    sync.RWMutex
)

/**
* Desc: 导入配置文件
* User: cuixiaonai
* Email: 15965873315@163.com
* Date: 2022/1/10 11:30 AM
 */
func (c GlobalConfig) InitConfigJson() error {
	configpath := GetConfPath()
	file, err := ioutil.ReadFile(configpath)
	if err != nil {
		logging.Error("配置文件读取错误,找不到配置文件", err)
		return err
	}
	if err = json.Unmarshal(file, &c); err != nil {
		logging.Error("配置文件读取失败", err)
		return err
	}
	// 开启锁
	configMux.Lock()
	globalConfig = &c
	configMux.Unlock()
	return nil
}

/**
* Desc: 获取配置文件路径
* User: cuixiaonai
* Email: 15965873315@163.com
* Date: 2022/1/10 11:30 AM
 */
func GetConfPath() string {
	str, _ := os.Getwd()
	return str + "/config/Config.json"
}

/**
* Desc: 获取配置
* User: cuixiaonai
* Email: 15965873315@163.com
* Date: 2022/1/10 11:30 AM
 */
func Config() *GlobalConfig {
	return globalConfig
}
